/**
 * WASM版本的字符串混淆和还原工具
 */

let wasmModule: null | WebAssembly.Instance = null;

/**
 * 初始化WASM模块
 */
export async function initWasm() {
  if (wasmModule) {
    return wasmModule;
  }

  try {
    // 这里需要实际构建WASM模块后才能正确导入
    // 暂时使用一个模拟实现来确保API一致性
    // const wasm = await import('../../dist/wasm/cdd_crypto_wasm.js');
    wasmModule = (
      await WebAssembly.instantiateStreaming(fetch('./cdd-crypto.wasm'))
    ).instance;
    return wasmModule;
  } catch (error) {
    console.warn('WASM模块加载失败，使用JavaScript版本:', error);
    return null;
  }
}

/**
 * 使用WASM对字符串进行混淆处理
 * @param str 需要混淆的字符串
 * @param interval 插入混淆字符的间隔，默认为10
 * @param charset 用于混淆的字符集，默认为字母和数字
 * @returns 混淆后的字符串
 */
export async function obfuscateWasm(
  str: string,
  interval: number = 10,
  charset?: string,
): Promise<string> {
  const wasm = await initWasm();
  if (!wasm) {
    // 如果WASM不可用，回退到JavaScript实现
    const { obfuscate } = await import('./crypto.mts');
    return Promise.resolve(obfuscate(str, interval, charset));
  }

  try {
    const { encrypt_wasm } = (await wasm.exports) as {
      encrypt_wasm: (
        encryptedText: string,
        interval: number,
        charset: string,
      ) => string;
      decrypt_wasm: (
        encryptedText: string,
        interval: number,
        charset: string,
      ) => string;
    };
    return encrypt_wasm(
      str,
      interval,
      charset ||
        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
    );
  } catch (error) {
    console.error('WASM混淆失败，回退到JavaScript实现:', error);
    const { obfuscate } = await import('./crypto.mts');
    return obfuscate(str, interval, charset);
  }
}

/**
 * 使用WASM还原混淆的字符串
 * @param str 混淆后的字符串
 * @returns 还原后的原始字符串
 */
export async function deobfuscateWasm(str: string): Promise<string> {
  const wasm = await initWasm();
  if (!wasm) {
    // 如果WASM不可用，回退到JavaScript实现
    const { deobfuscate } = await import('./crypto.mts');
    return Promise.resolve(deobfuscate(str));
  }

  try {
    const { decrypt_wasm } = (await wasm.exports) as {
      encrypt_wasm: (
        encryptedText: string,
        interval: number,
        charset: string,
      ) => string;
      decrypt_wasm: (
        encryptedText: string,
        interval: number,
        charset: string,
      ) => string;
    };
    // 注意：虽然WASM函数签名需要3个参数，但实际处理deobfuscation时只需要第一个参数
    // 这里传入默认值以满足函数签名要求
    return decrypt_wasm(
      str,
      10,
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
    );
  } catch (error) {
    console.error('WASM还原失败，回退到JavaScript实现:', error);
    const { deobfuscate } = await import('./crypto.mts');
    return deobfuscate(str);
  }
}
